package cn.avalon.service.impl;


import cn.avalon.domain.JsonResult;
import cn.avalon.domain.Movie;
import cn.avalon.domain.User;
import cn.avalon.dto.BuyMovieDto;
import cn.avalon.dto.MovieDto;
import cn.avalon.dto.WatchMovieDto;
import cn.avalon.feign.MovieService;
import cn.avalon.mapper.UserMapper;
import cn.avalon.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;

/**
 * @description:
 * @author: Avalon
 * @date: 2022年09月25日 ： 15:37
 * @version: ver1.0
 * @email 709785494@qq.com
 */
@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private MovieService movieService;

    @Autowired
    private UserMapper userMapper;

    @Override
    public Movie findById(Long id) {
        return movieService.findById(id);
    }

    @Override
    public JsonResult buyMovie(BuyMovieDto buyMovieDto) {
        try { // 购买电影票
            // 1.获取购买者信息
            User user = userMapper.findById(buyMovieDto.getId());
            // 2.获取电影票信息
            Movie movie = movieService.findById(buyMovieDto.getMovieId());
            // 3.1将count转换为BigDecimal格式
            BigDecimal count = new BigDecimal(buyMovieDto.getCount());
            // 3.2计算购买的价格
            BigDecimal multiply = movie.getPrice().multiply(count);
            // 3.3判断是否有足够的金额购买
            int i = user.getBalance().compareTo(multiply);
            if (i < 0) { // 3.1余额不足
                return new JsonResult(false, "余额不足，请充值！");
            }
            // 3.2余额足够，支付电影票
            BigDecimal subtract = user.getBalance().subtract(multiply);
            // 4.余额修改后修改user信息
            user.setBalance(subtract);
            userMapper.update(user);
            // 5.用户已经获取电影票，在电影服务中新增用户与电影票数据
            MovieDto movieDto = new MovieDto(buyMovieDto.getMovieId(), buyMovieDto.getCount(), buyMovieDto.getId(), 0);
            return movieService.buyMovie(movieDto);
        } catch (Exception e) {
            e.printStackTrace();
            return new JsonResult(false, "购买失败");
        }
    }

    @Override
    public JsonResult watchMovie(WatchMovieDto watchMovieDto) {
        return movieService.watchMovie(watchMovieDto);
    }
}
